package cc.fs.kotlin.ui.activity.helper


import android.os.Build
import android.util.Log
import org.jetbrains.anko.getStackTraceString
import java.text.SimpleDateFormat
import java.util.*

/**
 * 应用程序异常类：用于捕获异常和提示错误信息
 * 存在问题：１．没有可视化提示　２.类似报错后就凡是涉及到可视化的部执行了?
 */
class DefaultExceptionHandler private constructor() : Thread.UncaughtExceptionHandler {

    /** 系统默认的UncaughtException处理类  */
    private val mDefaultHandler: Thread.UncaughtExceptionHandler?

    init {
        this.mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler()
    }

    override fun uncaughtException(thread: Thread, ex: Throwable) {
        if (!handleException(ex) && mDefaultHandler != null) {
            //交给系统默认处理
            mDefaultHandler.uncaughtException(thread, ex)
        }
    }

    /**
     * 自定义异常处理:收集错误信息&发送错误报告
     * @param exception
     * *
     * @return true:处理了该异常信息;否则返回false
     */
    private fun handleException(exception: Throwable): Boolean {
        val flag = false
        //        try {
        //            flag = App.onHandleException(exception);
        //        } catch (Exception e) {
        //            QALog.e(e);
        //        }
        if (!flag) {
            onHandleException(exception)
        }

        //截取错误信息
        return true
    }

    /**
     * 自己实现的异常处理
     * @param exception
     */
    private fun onHandleException(exception: Throwable) {
        //封装错误信息
        val formatter = SimpleDateFormat ("yyyy年MM月dd日 HH:mm:ss ");
        val curDate = Date(System.currentTimeMillis());//获取当前时间
        val currentTime = formatter.format(curDate);
        val appException: AppException = AppException()
        appException.devName = Build.MODEL
        appException.sysVersion = Build.VERSION.RELEASE
        appException.time = currentTime
        appException.detailMsg = exception.getStackTraceString()
        appException.print()

        exceptionListener?.onException(appException)
    }



    /** app 错误封装类  */
    inner class AppException {
        /** 设备名称  */
        var devName: String = ""
        /** 系统版本  */
        var sysVersion: String = ""
        /** 发生时间  */
        var time: String = ""
        /** 错误详细信息  */
        var detailMsg: String = ""

        fun print() {
            Log.e("app 错误信息 ", " 设备名称: $devName\n 系统版本: $sysVersion\n 发生时间: $time\n 具体错误信息: $detailMsg\n")
        }
    }

    interface OnExceptionListener {
        fun onException(exception: AppException)
    }

    companion object {
        var exceptionListener: OnExceptionListener ? = null

        /**  注册监听APP未捕获异常 */
        fun registUncaughtExceptionHandler(_exceptionListener: OnExceptionListener) {
            exceptionListener = _exceptionListener
            Thread.setDefaultUncaughtExceptionHandler(DefaultExceptionHandler())
        }
    }

}
